#ifndef BUSCADORCLIENTE_H_
#define BUSCADORCLIENTE_H_

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <vector>
#include <pthread.h>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <errno.h>

#include "../../Modelo/ObjetosJuego/Personajes/TiposPersonaje.h"

#define LOG_BUSCADOR "buscador.log"

using namespace std;

enum EstadoBuscador {
	AceptaConexiones,
	RechazaConexiones,
	NoAceptaConexiones
};

class BuscadorCliente {
	
	protected:
	
		int socketfd;
		pthread_t thread;
		
		unsigned int clientesPotenciales;
		pthread_mutex_t mutexClientesPotenciales;
		
		EstadoBuscador estado;
		pthread_mutex_t mutexEstado;
		
	public:
	
		std::ofstream log_buscador;
	
		BuscadorCliente(int puerto);
		virtual ~BuscadorCliente();
		
		void ComenzarBusqueda(void* datos, void* funcion(void*));
		int BuscarCliente();
		
		int getSocketFd();
		pthread_t getThread();
		
		void setEstado(EstadoBuscador estado);
		EstadoBuscador getEstado();		
		
		int getClientesPotenciales();
		void AgregarClientePotencial();
		void EliminarClientePotencial();
		
		void CrearClientePotencial(void* datos, void* funcion(void*));
		string CodificarInfoImagenes(vector< infoImagen_t > infoImagenes);
		string CodificarInfoSonidos(vector< infoSonido_t > infoSonidos);
		string CodificarPersonajesHabilitados(vector< pair<int, TipoPersonaje*> > personajes);

};

void* BuscarCliente(void* buscador);
	

#endif /* BUSCADORCLIENTE_H_ */
